#coding: utf8

from django.contrib import admin
from django.forms import TextInput
from django.db import models
from django import forms
from django.contrib import messages


from antimicrobiano.models import Paciente
from antimicrobiano.models import Medico
from antimicrobiano.models import Enfermaria
from antimicrobiano.models import Clinica
from antimicrobiano.models import Leito
from antimicrobiano.models import Posologia
from antimicrobiano.models import Antimicrobiano
from antimicrobiano.models import Fase
from antimicrobiano.models import TipoDose
from antimicrobiano.models import Periodo
from antimicrobiano.models import Unidade
from antimicrobiano.models import Prontuario
from antimicrobiano.models import Solicitacao
from antimicrobiano.models import Patologia
from antimicrobiano.models import Pessoa
from antimicrobiano.models import Tratamento
from antimicrobiano.models import PosologiaAlternativa
from antimicrobiano.models import Aprovacao
from antimicrobiano.models import SolicitacaoFechada
from antimicrobiano.models import Dispensa

from antimicrobiano.forms import AntimicrobianoAdminForm
from antimicrobiano.forms import PosologiaAdminForm
from antimicrobiano.forms import SolicitacaoAdminForm
from antimicrobiano.ddiscreto import STATUS_ABERTO
from antimicrobiano.ddiscreto import STATUS_RECUSADO
from antimicrobiano.ddiscreto import STATUS_APROVADO
from antimicrobiano.ddiscreto import STATUS_EM_ANALISE
from antimicrobiano.ddiscreto import SIM
from antimicrobiano.ddiscreto import NAO
from django.http import HttpResponseRedirect


class EnfermariaInLine(admin.StackedInline):
    model = Enfermaria
    extra = 3

class EnfermariaAdmin(admin.ModelAdmin):
    pass

class ClinicaAdmin(admin.ModelAdmin):
    inlines = [EnfermariaInLine]

class PosologiaInLine(admin.TabularInline):

    #form = PosologiaAdminForm

    formfield_overrides = {
        models.FloatField: {'widget': TextInput(attrs={'size':'10'})},
    }


    model = Posologia
    extra = 3

    fields = ['fase','dose_inicial','dose_final','unidade','periodo','dose_maxima','unidade_dose_maxima','tipo_dose','duracao_tratamento']


class AntimicrobianoAdmin(admin.ModelAdmin):
    form = AntimicrobianoAdminForm

    list_display = ['nome','posologias']

    search_fields = ['nome']
    list_filter = ['nome','created_at','updated_at']

    inlines = [PosologiaInLine]


class LeitoAdmin(admin.ModelAdmin):
    #fields = ['enfermaria','nome','observacao']
    #antes de salver o leito, devemos setar com a enfermaria que esta na sessao
    def save_model(self, request, obj, form, change):

        if not change:
            enfermaria = Enfermaria.objects.get(id=request.session['enfermaria'])
            obj.enfermaria = enfermaria

        obj.save()



    def queryset(self, request):
        #recuperar todos os parametros passados via POST
        params = request.POST

        #recuperar o valor do parametro 'enfermaria_selecionado'
        #Se o parametro estiver setado na sessao, recuperar dele. Caso contrario,
        #utilizar o da sessao
        if (params.get('enfermaria_selecionada')):
            par_enfermaria = params.get('enfermaria_selecionada')
        else:
            par_enfermaria = request.session['enfermaria']


        #colocando o valor da enfermaria na sessao, para que a logica de leito sempre
        #saiba qual a enfermaria utilizada
        request.session['enfermaria'] = par_enfermaria

        qs = super(LeitoAdmin, self).queryset(request)
        #return qs
        return qs.filter(enfermaria=par_enfermaria)


class ProntuarioAdmin(admin.ModelAdmin):
    search_fields = ['identificador']
    list_display = ['identificador','dataEntrada','medico','paciente','leito']
    list_filter = ['dataEntrada','medico']

class SolicitacaoAdmin(admin.ModelAdmin):

    def save_model(self, request, obj, form, change):
        medico = Medico.objects.get(user=request.user)
        
        if (medico != None):
            obj.medico = medico
            
        #print "---------------: " + request.user.username
        
        
        has_posologia = False
        obj.possui_restricao = NAO
        obj.restricao = ""
        mensagem = ""
        
        # recuperar o paciente
        paciente = obj.prontuario.paciente
        
        # recuperar a idade
        idade = paciente.idade()
        
        posologias_temp = []
        posologias = obj.antimicrobiano.posologia_set.all()
                                                    
        
        # verificar se a posologia esta cadastrada
        for posologia in posologias:
            if posologia.fase.nome == paciente.fase():
                if posologia.tipo_dose == obj.tipo_dose:
                    if posologia.periodo == obj.periodo:
                        has_posologia = True
                        break
                    #TODO: completar a pesquisa da posologia com as outras informacoes 
                    #da solicitacao
        
        if not has_posologia:
            mensagem =  'O Medicamento %s nao possui posologia cadastrada de acordo com os dados informados' % obj.antimicrobiano.nome 
            obj.possui_restricao = SIM
            obj.restricao = mensagem
            
            request.user.message_set.create(message=mensagem)
            #messages.warning(request, 'Your account expires in three days.')        
            

        obj.save()

    def change_view(self, request, object_id, extra_context=None):

        solicitacao = Solicitacao.objects.get(id=object_id)

        if solicitacao.situacao == STATUS_ABERTO:
            return super(SolicitacaoAdmin, self).change_view(request, object_id, extra_context)
        else:
            return HttpResponseRedirect('/admin/antimicrobiano/solicitacaofechada/%s/' % object_id)

    #def queryset(self, request):
    #    qs = super(SolicitacaoAdmin, self).queryset(request)
    #    return qs.filter(situacao=STATUS_ABERTO)

    form = SolicitacaoAdminForm

    fields = ['prontuario','paciente','leito','antimicrobiano','patologia'
              ,'periodo','dose','unidade','tipo_dose','justificativa'
              ,'funcao_renal','funcao_epatica_normal','realizou_cultura'
              ,'resultado','restricao_str']

    list_display = ['id','prontuario','paciente','leito','medico','situacao','possui_restricao']

    # raw_id_fields converte o campo para um campo input com um botao de pesquisa
    raw_id_fields = ('prontuario','antimicrobiano','patologia','medico')

    readonly_fields = ('situacao','paciente','leito','restricao_str')

    list_filter = ['medico','situacao']


class AprovacaoAdmin(admin.ModelAdmin):
    
    def change_view(self, request, object_id, extra_context=None):

        solicitacao = Solicitacao.objects.get(id=object_id)
        solicitacao.situacao = STATUS_EM_ANALISE
        solicitacao.save()
        
        return super(AprovacaoAdmin, self).change_view(request, object_id, extra_context)



    list_display = ['situacao','dispensado','id_prontuario','nome_patologia','Nome_antimicrobiano','dosagem','periodo_tramamento']

    fields = ['prontuario','paciente','leito','medico','antimicrobiano','patologia'
              ,'periodo','dose','unidade','tipo_dose','justificativa'
              ,'funcao_renal','funcao_epatica_normal','realizou_cultura'
              ,'resultado','situacao','justificativa_aprovacao']

    readonly_fields = ('prontuario','paciente','leito','medico','antimicrobiano','patologia'
              ,'periodo','dose','unidade','tipo_dose','justificativa'
              ,'funcao_renal','funcao_epatica_normal','realizou_cultura'
              ,'resultado')
    
    list_filter = ['medico','situacao']


# utilizado para crir uma ação na lista de dispensas
def aprovar_dispensa(modeladmin, request, queryset):
    queryset.filter(situacao=STATUS_APROVADO).update(dispensado='S')

class DispensaAdmin(admin.ModelAdmin):
    list_display = ['dispensado','situacao','updated_at','id_prontuario','nome_patologia','Nome_antimicrobiano','dosagem','periodo_tramamento']

    fields = ['prontuario','paciente','leito','medico','antimicrobiano','patologia'
              ,'periodo','dose','unidade','tipo_dose','justificativa'
              ,'funcao_renal','funcao_epatica_normal','realizou_cultura'
              ,'resultado','situacao','justificativa_aprovacao', 'dispensado','justificativa_dispensa']

    readonly_fields = ('prontuario','paciente','leito','medico','antimicrobiano','patologia'
              ,'periodo','dose','unidade','tipo_dose','justificativa'
              ,'funcao_renal','funcao_epatica_normal','realizou_cultura'
              ,'resultado','situacao','justificativa_aprovacao')
    
    list_filter = ['medico','situacao']
    # faz referencia a ação de aprovar dispensas
    actions = [aprovar_dispensa]
    

class SolicitacaoFechadaAdmim(admin.ModelAdmin):

    def queryset(self, request):
        qs = super(SolicitacaoFechadaAdmim, self).queryset(request)

        return qs.filter(situacao__in=[STATUS_APROVADO, STATUS_RECUSADO, STATUS_EM_ANALISE])

    list_display = ['id_prontuario','nome_patologia','Nome_antimicrobiano','dosagem','periodo_tramamento','situacao']

    fields = ['prontuario','paciente','leito','medico','antimicrobiano','patologia'
              ,'periodo','dose','unidade','tipo_dose','justificativa'
              ,'funcao_renal','funcao_epatica_normal','realizou_cultura'
              ,'resultado','situacao','justificativa_aprovacao']

    readonly_fields = ('situacao', 'prontuario','paciente','leito','medico','antimicrobiano','patologia'
              ,'periodo','dose','unidade','tipo_dose','justificativa'
              ,'funcao_renal','funcao_epatica_normal','realizou_cultura'
              ,'resultado','justificativa_aprovacao')

class TratamentoInLine(admin.StackedInline):
    model = Tratamento
    extra = 3

class TratamentoAdmin(admin.ModelAdmin):
    pass

class PatologiaAdmin(admin.ModelAdmin):
    inlines = [TratamentoInLine]


class PosologiaAlternativaAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):

        if not change:
            tratamento = Tratamento.objects.get(id=request.session['tratamento'])
            obj.tratamento = tratamento

        obj.save()



    def queryset(self, request):
        #recuperar todos os parametros passados via POST
        params = request.POST

        #recuperar o valor do parametro 'enfermaria_selecionado'
        #Se o parametro estiver setado na sessao, recuperar dele. Caso contrario,
        #utilizar o da sessao
        if (params.get('tratamento_selecionado')):
            par_tratamento = params.get('tratamento_selecionado')
        else:
            par_tratamento = request.session['tratamento']


        #colocando o valor da enfermaria na sessao, para que a logica de leito sempre
        #saiba qual a enfermaria utilizada
        request.session['tratamento'] = par_tratamento

        qs = super(PosologiaAlternativaAdmin, self).queryset(request)
        #return qs
        return qs.filter(tratamento=par_tratamento)

    fields = ['fase','dose_inicial','dose_final','unidade','periodo','dose_maxima','unidade_dose_maxima','tipo_dose','duracao_tratamento']


class MedicoAdmin(admin.ModelAdmin):
    search_fields = ['nome']
    raw_id_fields = ['user']
    
class FaseAdmin(admin.ModelAdmin):
    list_display = ['nome','inicio_str','fim_str']

class PacienteAdmin(admin.ModelAdmin):
    list_display = ['nome','cpf','data_nascimento_str','idade','fase']
    search_fields = ['nome','cpf']

admin.site.register(Paciente, PacienteAdmin)
admin.site.register(Medico, MedicoAdmin)
admin.site.register(Clinica, ClinicaAdmin)
admin.site.register(Leito, LeitoAdmin)
admin.site.register(Fase, FaseAdmin)
admin.site.register(TipoDose)
admin.site.register(Periodo)
admin.site.register(Unidade)
admin.site.register(Antimicrobiano, AntimicrobianoAdmin)
admin.site.register(Prontuario,ProntuarioAdmin)
admin.site.register(Solicitacao, SolicitacaoAdmin)
admin.site.register(Enfermaria)
admin.site.register(Pessoa, PacienteAdmin)
admin.site.register(Patologia, PatologiaAdmin)
admin.site.register(Tratamento, TratamentoAdmin)
admin.site.register(PosologiaAlternativa, PosologiaAlternativaAdmin)
admin.site.register(Aprovacao, AprovacaoAdmin)
admin.site.register(SolicitacaoFechada, SolicitacaoFechadaAdmim)
admin.site.register(Dispensa, DispensaAdmin)

